<?php
class o2o_mdl_store extends dbeav_model
{
    /**
     * 准备导入的参数定义
     *
     * @param Null
     * @return Null
     */
    function prepared_import_csv()
    {
        $this->ioObj->cacheTime = time();
    }
    
    /**
     * 准备导入的数据主体内容部分检查和处理
     *
     * @param Array $data
     * @param Boolean $mark
     * @param String $tmpl
     * @param String $msg
     * @return Null
     */
    function prepared_import_csv_obj($data,$mark,$tmpl,&$msg = '')
    {
        return null;
    }
    
    /**
     * 准备导入的数据明细内容部分检查和处理
     *
     * @param Array $row
     * @param String $title
     * @param String $tmpl
     * @param Boolean $mark
     * @param Boolean $newObjFlag
     * @param String $msg
     * @return Null
     */
    function prepared_import_csv_row($row,$title,&$tmpl,&$mark,&$newObjFlag,&$msg)
    {
        $serverObj         = app::get('o2o')->model('server');
        $regionObj         = app::get('eccommon')->model('regions');
        $organizationObj   = app::get('organization')->model('organization');
        $checkStoreLib     = kernel::single('o2o_store');
        
        if (empty($row))
        {
            return true;
        }
        
        $mark = false;
        
        if( substr($row[0],0,1) == '*' )
        {
            $titleRs    = array_flip($row);
            $mark       = 'title';
            
            #[防止重复]记录组织编码
            $this->store_bn_list    = array();
            $this->store_name_list  = array();
            $this->basicm_nums      = 1;
            
            return $titleRs;
        }
        else
        {
            $re    = base_kvstore::instance('o2o_store')->fetch('o2oStore-'.$this->ioObj->cacheTime,$fileData);
            
            if( !$re ) $fileData = array();
            
            //判断导入的数量
            if(isset($this->basicm_nums))
            {
                $this->basicm_nums++;
                if($this->basicm_nums > 5000){
                    $msg['error'] = "导入的数量量过大，请减少到5000个以下！";
                    return false;
                }
            }
            
            //导入数据检查
            if(!$row[0]){
                $msg['error'] = "门店编码必须填写,门店名称：". $row[1];
                return false;
            }
            
            if(!$row[1]){
                $msg['error'] = "门店名称必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[2]){
                $msg['error'] = "所属组织必须填写（例格式：华东地区-上海）,门店编码：". $row[0];
                return false;
            }
            
            //状态值
            if($row[3] == "启用")
            {
                $row[3] = 1;
            }
            elseif($row[3] == "停用")
            {
                $row[3] = 2;
            }
            else
            {
                $msg['error'] = "门店状态填写错误,门店编码：".$row[0].",请填写启用、停用";
                return false;
            }
            
            if(!$row[4]){
                $msg['error'] = "所属地区必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[5]){
                $msg['error'] = "所属服务端必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[6]){
                $msg['error'] = "门店地址必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[7]){
                $msg['error'] = "邮编必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[8]){
                $msg['error'] = "联系人必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(empty($row[9]) && empty($row[10])){
                $msg['error'] = "固定电话与手机号码必需填写一项,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[11]){
                $msg['error'] = "经营模式必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[12]){
                $msg['error'] = "是否支持自提必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[13]){
                $msg['error'] = "是否支持配送必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[14]){
                $msg['error'] = "是否支持门店售后必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[15]){
                $msg['error'] = "是否需要订单回执确认必须填写,门店编码：". $row[0];
                return false;
            }
            
            if(!$row[16]){
                $msg['error'] = "门店经纬度必须填写,门店编码：". $row[0];
                return false;
            }
            
            #[防止重复]检查门店编码
            if(in_array($row[0], $this->store_bn_list))
            {
                $msg['error'] = 'Line '.$this->basicm_nums.'：门店编码【'. $row[0] .'】重复！';
                return false;
            }
            $this->store_bn_list[]    = $row[0];
            
            #[防止重复]检查门店名称
            if(in_array($row[1], $this->store_name_list))
            {
                $msg['error'] = 'Line '.$this->basicm_nums.'：门店名称【'. $row[0] .'】重复！';
                return false;
            }
            $this->store_name_list[]    = $row[1];
            
            //经营模式store_type
            if($row[11] == "自营")
            {
                $row[11] = 'self';
            }
            elseif($row[11] == "加盟")
            {
                $row[11] = 'join';
            }
            elseif($row[11] == "合营")
            {
                $row[11] = 'cooperation';
            }
            elseif($row[11] == "代理")
            {
                $row[11] = 'proxy';
            }
            elseif($row[11] == "特殊")
            {
                $row[11] = 'special';
            }
            elseif($row[11] == "其他")
            {
                $row[11] = 'other';
            }
            else
            {
                $msg['error'] = "经营模式填写错误,门店编码：".$row[0].",请填写自营、加盟、合营、代理、特殊、其他";
                return false;
            }
            
            //自提
            if($row[12] == "支持")
            {
                $row[12] = 1;
            }
            elseif($row[12] == "不支持")
            {
                $row[12] = 2;
            }
            else 
            {
                $msg['error'] = "是否支持自提填写错误,门店编码：".$row[0].",请填写支持、不支持";
                return false;
            }
            
            //配送
            if($row[13] == "支持")
            {
                $row[13] = 1;
            }
            elseif($row[13] == "不支持")
            {
                $row[13] = 2;
            }
            else
            {
                $msg['error'] = "是否支持配送填写错误,门店编码：".$row[0].",请填写支持、不支持";
                return false;
            }
            
            //门店售后
            if($row[14] == "支持")
            {
                $row[14] = 1;
            }
            elseif($row[14] == "不支持")
            {
                $row[14] = 2;
            }
            else
            {
                $msg['error'] = "是否支持门店售后填写错误,门店编码：".$row[0].",请填写支持、不支持";
                return false;
            }
            
            //订单回执确认
            if($row[15] == "需要")
            {
                $row[15] = 1;
            }
            elseif($row[15] == "不需要")
            {
                $row[15] = 2;
            }
            else
            {
                $msg['error'] = "是否需要订单回执确认填写错误,门店编码：".$row[0].",请填写支持、不支持";
                return false;
            }
            
            //数据组织
            $map    = explode('|', $row[16]);
            $row['coordinate']    = $map[0] .','. $map[1];//经纬度
            
            $row['org_no']    = $row[0];//组织编码
            $row['org_name']  = $row[1];//组织名称
            $row['zip']       = $row[7];//邮编
            $row['tel']       = $row[9];//固定电话
            $row['mobile']    = $row[10];//手机号
            
            #check数据检查
            $error_msg        = '';
            if(!$checkStoreLib->checkAddParams($row, $error_msg))
            {
                $error_msg    .= ',门店编码：'. $row[0];
                $this->end(false, $error_msg);
            }
            
            //所属组织
            $org_level_num            = 1;//组织层级
            $org_id                   = 0;
            $org_parents_structure    = '';//组织架构结构
            
            $temp_org    = explode('-', $row[2]);
            foreach ($temp_org as $key => $val)
            {
                $org_row    = $organizationObj->dump(array('org_name'=>$val, 'org_type'=>1), 'org_id, org_name, parent_id');
                if(empty($org_row))
                {
                    $msg['error'] = "所属组织名称[". $val ."]不存在,门店编码：". $row[0];
                    return false;
                }
                
                #判断所属组织是否上下级关系
                $org_row['parent_id']    = intval($org_row['parent_id']);
                
                if($org_id != $org_row['parent_id'])
                {
                    $msg['error'] = "所属组织[". $val ."]与[". $temp_org[$key - 1] ."]没有关联,门店编码：". $row[0];
                    return false;
                }
                
                $org_id                   = intval($org_row['org_id']);
                $org_parents_structure    .= ('/' . $org_row['org_name']);
                
                $org_level_num++;
            }
            
            $row['parent_id']                = $org_id;
            $row['org_level_num']            = $org_level_num;
            $row['org_parents_structure']    = 'mainOrganization:'. substr($org_parents_structure, 1) .':'. $org_id;
            
            //所属服务端
            $temp_server    = $serverObj->dump(array('name'=>$row['5']), 'server_id');
            if(empty($temp_server))
            {
                $msg['error'] = "所属服务端[". $row['5'] ."]不存在,门店编码：". $row[0];
                return false;
            }
            $row['server_id']    = $temp_server['server_id'];
            
            //所属地区
            $region_id           = 0;
            $temp_region         = explode('-', $row[4]);
            
            foreach ($temp_region as $key => $val)
            {
                $region_row    = $regionObj->dump(array('local_name'=>$val), 'region_id, local_name, p_region_id, haschild');
                if(empty($region_row))
                {
                    $msg['error'] = "所属地区[". $val ."]不存在,门店编码：". $row[0];
                    return false;
                }
                
                #判断地区是否上下级关系
                $region_row['p_region_id']  = intval($region_row['p_region_id']);
                
                if($region_id != $region_row['p_region_id'])
                {
                    $msg['error'] = "所属地区[". $val ."]与[". $temp_region[$key - 1] ."]没有关联,门店编码：". $row[0];
                    return false;
                }
                
                $region_id           = intval($region_row['region_id']);
            }
            
            #判断地区是否填写到最后一级
            if($region_row['haschild'])
            {
                $msg['error'] = "所属地区[". $region_row['local_name'] ."]没有填写到最后一级,门店编码：". $row[0];
                return false;
            }
            $row['region']    = 'mainland:'. str_replace('-', '/', $row[4]) .':'. $region_id;
            
            #格式化数据
            $sdf    = array(
                        'org_no' => $row['org_no'],
                        'org_name'=> $row['org_name'],
                        'org_type' => 2,
                        'status' => $row[3],
                        'area' => $row['region'],
                        'org_level_num' => $row['org_level_num'],
                        'org_parents_structure' => $row['org_parents_structure'],
                        'parent_id' => $row['parent_id'],
                        
                        'server_id' => $row['server_id'],
                        'addr' => $row[6],
                        'longitude' => $row['longitude'],
                        'latitude' => $row['latitude'],
                        'zip' => $row['zip'],
                        'contacter' => $row[8],
                        'mobile' => $row['mobile'],
                        'tel' => $row['tel'],
                        'store_type' => $row[11],
                        'self_pick' => $row[12],
                        'distribution' => $row[13],
                        'aftersales' => $row[14],
                        'confirm' => $row[15],
                    );
            
            #销毁
            unset($row, $region_id, $region_row, $temp_server, $temp_org, $org_parents_structure, $org_level_num);
            
            $fileData['basicm']['contents'][]    = $sdf;
            base_kvstore::instance('o2o_store')->store('o2oStore-'.$this->ioObj->cacheTime,$fileData);
        }
        
        return null;
    }
    
    /**
     * 完成导入
     *
     * @param Null
     * @return Null
     */
    function finish_import_csv()
    {
        base_kvstore::instance('o2o_store')->fetch('o2oStore-'.$this->ioObj->cacheTime,$data);
        base_kvstore::instance('o2o_store')->store('o2oStore-'.$this->ioObj->cacheTime,'');
        
        $oQueue = app::get('base')->model('queue');
        $aP = $data;
        $pSdf = array();
        
        $count = 0;
        $limit = 50;
        $page = 0;
        $orderSdfs = array();
        
        foreach ($aP['basicm']['contents'] as $k => $aPi){
            if($count < $limit){
                $count ++;
            }else{
                $count = 0;
                $page ++;
            }
            $pSdf[$page][] = $aPi;
        }
        
        foreach($pSdf as $v){
            $queueData = array(
                    'queue_title' => '门店批量导入',
                    'start_time' => time(),
                    'params' => array(
                                    'sdfdata' => $v,
                                    'app' => 'o2o',
                                    'mdl' => 'store'
                                ),
                    'worker' => 'o2o_store_to_import.run',
            );
            $oQueue->save($queueData);
        }
        $oQueue->flush();
        
        //记录日志
        $operationLogObj    = app::get('ome')->model('operation_log');
        $operationLogObj->write_log('o2o_store_import@wms', 0, "批量导入门店,本次共导入". count($aP['basicm']['contents']) ."条记录!");
        
        return null;
    }
    
    /**
     * 导入门店模板的标题
     *
     * @param Null
     * @return Array
     */
    function exportTemplate()
    {
        $tmpList    = $this->io_title();
        foreach ($tmpList as $v)
        {
            $title[]    = kernel::single('base_charset')->utf2local($v);
        }
        
        return $title;
    }
    
    /**
     * 导入导出的标题
     *
     * @param $ioType  导入文件格式
     * @return Array
     */
    function io_title($ioType='csv')
    {
        $this->oSchema['csv']    = array(
                                        '*:门店编码' => 'store_bn',
                                        '*:门店名称' => 'name',
                                        '*:所属组织' => 'organization_name',
                                        '*:状态' => 'status',
                                        '*:所属地区' => 'area',
                                        '*:所属服务端' => 'server_name',
                                        
                                        '*:门店地址' => 'addr',
                                        '*:邮编' => 'zip',
                                        '*:联系人' => 'contacter',
                                        '*:固定电话' => 'tel',
                                        '*:手机号' => 'mobile',
                                        
                                        '*:经营模式' => 'store_type',
                                        '*:是否支持自提' => 'self_pick',
                                        '*:是否支持配送' => 'distribution',
                                        '*:是否支持门店售后' => 'aftersales',
                                        '*:是否需要订单回执确认' => 'confirm',
                                        '*:门店经纬度(以|竖线分隔)' => 'map',
                                    );
        
        $this->ioTitle[$ioType]    = array_keys($this->oSchema[$ioType]);
        
        return $this->ioTitle[$ioType];
    }
}
